package com.cjl.interview150.section;


import java.util.ArrayList;
import java.util.List;

public class SectionPractice {
    /**
     * 228. 汇总区间
     * @param nums
     * @return
     */
    public List<String> summaryRanges(int[] nums) {
        ArrayList<String> res = new ArrayList<>();
        int i = 0;
        int n = nums.length;
        while (i < n) {
            int low = i;
            i++;
            while (i < n && nums[i] == nums[i - 1] + 1) {
                i++;
            }
            // i保留下一次的起点,high则是上一次的终点
            int high = i - 1;
            StringBuilder sb = new StringBuilder();
            sb.append(Integer.toString(nums[low]));
            if (low < high) {
                sb.append("->").append(Integer.toString(nums[high]));
            }
            res.add(sb.toString());
        }
        return res;
    }

    /**
     * 57. 插入区间
     * @param intervals
     * @param newInterval
     * @return
     */
    public int[][] insert(int[][] intervals, int[] newInterval) {
        // 获取插入区间的左右边界
        int left = newInterval[0];
        int right = newInterval[1];
        // 用于结果区间的集合
        ArrayList<int[]> resList = new ArrayList<>();
        // 判断新区间是否插入的标记变量,初始化为false表示未插入
        boolean isInsert = false;
        for (int[] interval : intervals) {
            if (interval[0] > right) { // 如果在插入区间的右侧则插入
                if (!isInsert) { // 如果没查如果则直接插入
                    resList.add(new int[]{left, right});
                    isInsert = true;
                }
                // 如果插入过则插入当前区间即可
                resList.add(interval);
            } else if (interval[1] < left) { // 当前区间在插入区间的左侧,则把当前区间加入结果集
                resList.add(interval);
            } else {  // 此时有交集,需要更新最长左右区间,以包含重叠的区间
                left = Math.min(left, interval[0]);
                right = Math.max(right, interval[1]);
            }
        }
        // 循环结束判断标记变量是否插入过,如果没插入则直接插入
        if (!isInsert) {
            resList.add(new int[]{left, right});
        }
        // 收集结果
        int[][] res = new int[resList.size()][2];
        for (int i = 0; i < resList.size(); i++) {
            res[i] = resList.get(i);
        }
        return res;
    }
}
